import { BehaviorTreeJson } from "../BehaviorTreeDefine";
import { EStatus } from "../common/EnumType";

/* Behavior接口是所有行为树节点的核心，且我规定所有节点的构造和析构方法都必须是protected，以防止在栈上创建对象，
* 所有的节点对象通过Create()静态方法在堆上创建，通过Release()方法销毁
* 由于Behavior是个抽象接口，故没有提供Create()方法，本接口满足如下契约
* 在Update方法被首次调用前，调用一次OnInit函数，负责初始化等操作
* Update()方法在行为树每次更新时调用且仅调用一次。
* 当行为不再处于运行状态时，调用一次OnTerminate()，并根据返回状态不同执行不同的逻辑
*/
export interface IBehaviour {
    //设置必要参数 操作对象
    setConfig(params: BehaviorTreeJson, target: any): void;

    //设置调用顺序
    tick(): EStatus;

    //初始化
    onInit(): void;

    //节点操作的具体实现
    onUpdate(dt: number): EStatus;

    //调用后
    onTerminate(status: EStatus): void;

    //释放
    release(): void;

    addChild(child: IBehaviour): void;

    setStatus(status: EStatus): void;

    getStatus(): EStatus;

    reset(): void;

    abort(): void;
}